
uint16_t ModBus_Table[1000];    // 存储键值对的值

typedef enum { 
    r_only,
    r_W,
    r_w_s
} AcccessType; // 数据类型枚举

#define base_addr

// 地址即键名
#define Charge_Status   0  // 充电状态 (0:待机  1:准备就绪  2:正在充电)
#define Charge_U        1   // 充电电压 0.1V
#define Charge_I        2   // 充电电流 0.1A
#define Charge_Energy_L 3   // 充电电量低16位 0.001度
#define Charge_Energy_H 4   // 充电电量高16位 0.001度
#define Charge_Time     5   // 充电时间 1分
#if(0)
#define Setting_U;                     //(6)BMS需求电压          0.1V
#define Setting_I;                     //(7)BMS需求电流          0.1A
#define Battery_Voltage;               //(8)电池电压						  0.1V
#define Reserve[3];                    //(9-11)保留
#define Card_ID_L;                     //(12)卡号低16位
#define Card_ID_H;                     //(13)卡号高16位
#define Card_Money_L;                  //(14)卡内余额低16位       0.01元
#define Card_Money_H;                  //(15)卡内余额高16位
#define Power_ON;                      //(16)开关机状态           (0:关机 1:开机 )
#define Remain_Time;                   //(17)充电剩余时间         1分
#define SOC;                           //(18)电池当前电量         1%
#define Pay_Money_L;                   //(19)消费金额低16位
#define Pay_Money_H;                   //(20)消费金额高16位       0.01元
#define Ele_Service_Price_L;           //(21)当前单价低位
#define Ele_Service_Price_H;           //(22)当前单价高位            
#define Channel_Sum_Charge_Energy_L;   //(23)电表电量读数低16位   0.01度
#define Channel_Sum_Charge_Energy_H;   //(24)电表电量读数高16位
#define Down_Message;                  //(25)显示屏下发消息       查找 Down_Message_Data   见地址表
#define VIN[9];                        //(26-34)当前充电VIN码
#define Service_Price_L;               //(35)服务费费率低位
#define Service_Price_H;               //(36)服务费费率高位
#define Ele_Price_L;                   //(37)电费费率低位
#define Ele_Price_H;                   //(38)电费费率低位
#define Charge_Power;                  //(39)功率       0.1kw

#define Gun_Status;             // 40插枪状态                 (0:未插枪 1:插枪)
#define Battery_Relay_Status;   // 41车上继电器状态           (0:未吸合  1:吸合)
#define BMS_Status;             // 42BMS状态                   查找BMS_STATE_Type         见地址表
#define BMS_Stop_Reason;        // 43BMS停机原因
#define Charger_Stop_Reason;    // 44充电机停机原因           查找 Stop_Status_Type    见地址表
#define Charger_Start_Reason;   // 45充电机开机原因           查找 Stop_Start_Type
#define Channel_Com_Status;     // 46通道连接状态             (0:未连接 1:连接)
#define Res_inc;                // 47绝缘电阻                  0.1M 欧
#define Tmp_DC_P;               // 48枪头正极温度              (-20 -- 80) 1度
#define Tmp_DC_N;               // 49枪头负极温度              (-20 -- 80) 1度
#define Gun_Liquid_Err;         // 50液冷系统故障状态          (0:正常 1:故障 )
#define Tmp_DC_STATE;           // 51 充电枪温度状态
#define Locked;                 // 52电子锁状态                (0:未锁定 1:锁定 )
#define Function_Com_Status;    // 53功能板连接状态            (0:未连接 1:连接 )
#define Channel_Version;        // 54BCD码 控制板程序版本号
#define Function_Version;       // 55BCD码 功能板版本号
#define Reserve;                // 56 保留
Sys_Err_Type Gun_Error;          // 57  先复用为通道异常状态
#define ElcMeter_Com_Status;    // 58电表连接状态
#define Ins_Status;             //(59)
  
#define BMS_Version;                         // 60BMS版本号
#define Battery_Type;                        // 61电池类型                   见地址表
#define Battery_Rated_Capacity;              // 62电池容量                   0.1Ah
#define Battery_Rated_U;                     // 63电池额定总电压             0.1V
#define Single_Battery_Allow_Highest_U;      // 64单体最高允许电压           0.01V
#define Single_Battery_Highest_U;            // 65单体最高电压               0.01V
#define Single_Battery_Allow_Highest_Temp;   // 66单体最高允许温度           1°    -50偏移量(-50 -- 200)
#define Single_Battery_Highest_Temp;         // 67单体最高温度               1°    -50偏移量(-50 -- 200)
#define BMS_Measure_U;                       // 68BMS端测量充电电压          0.1V
#define BMS_Measure_I;                       // 69BMS端测量充电电流          0.1A
#define Battery_Allow_Highest_U;             // 70电池最大允许充电电压       0.1V
#define Battery_U;                           // 71充电前电池电压             0.1V
#define Channel_Tip_Charge_Energy_L;         // 72尖峰平谷点电量
#define Channel_Tip_Charge_Energy_H;
#define Channel_Peak_Charge_Energy_L;
#define Channel_Peak_Charge_Energy_H;
#define Channel_Flat_Charge_Energy_L;
#define Channel_Flat_Charge_Energy_H;
#define Channel_Valley_Charge_Energy_L;
#define Channel_Valley_Charge_Energy_H;   //(79)
 
#define Control_Mode;             // 80控制模式             (0:BMS模式  1:BMS手动  2:手动模式)
#define Setting_U;                // 81手动模式下设定电压         0.1V
#define Setting_I;                // 82手动模式下设定电流         0.1A
#define Auxiliary_Power_Choose;   // 83辅助电源选择  12V    24V
#define Reserve;                  // 84 保留
#define Lock;                     // 85锁枪、预约设置
#define Reserve_2[3];             // 86-88 保留
#define Charge_Money_H;           // 89 设定充电金额高位    0.01元
#define Special_Charge_Mode;      // 90 条件充电模式              查找 Charge_Mode_Type  见地址表
#define Charge_Money_L;           // 91 设定充电金额    0.01元
#define Charge_Start_Time_Hour;   // 92BCD码  设定充电开始时间 小时  绝对时间
#define Charge_Start_Time_Min;    // 93BCD码  设定充电开始时间 分钟
#define Charge_End_Time_Hour;     // 94BCD码  设定充电结束时间 小时  绝对时间
#define Charge_End_Time_Min;      // 95BCD码  设定充电结束时间 分钟
#define Charge_Energy;            // 96设定充电电量						0.01度
#define Charge_Time;              // 97设定充电时间           1分钟  相对时间
#define Charge_End_SOC;           // 98设定结束SOC
#define Appointment;              // 99 保留
#endif

typedef struct {
    uint16_t key;           // 键名（如"temperature"）
    uint8_t data_len;       // 每个字段占2bytes
    AcccessType access;     // 读写权限（0:只读, 1:读写, 2:读写存）
} ModbusRegMap;

typedef struct {
    uint16_t key;               // 键名（如"temperature"）
    uint16_t reg_addr;          // Modbus寄存器地址（如0x0001）
    uint8_t data_bytes;
    void* storage_ptr;           // 数据存储指针
} EEpromRegMap;

ModbusRegMap modbus_reg_map[] = {
    {Charge_Status, r_W},
    {Charge_U, r_only}, 
};
const int reg_map_size = sizeof(modbus_reg_map) / sizeof(modbus_reg_map[0]);

// 通过键名快速定位映射表中的寄存器配置
ModbusRegMap* find_reg_by_key(const uint16_t key) {
    for (int i = 0; i < reg_map_size; i++) {
        if (reg_map[i].key == key) {
            return &reg_map[i];
        }
    }
    return NULL; // 未找到
}

int read_by_key(modbus_t *ctx, const uint16_t key) {
    ModbusRegMap *reg = find_reg_by_key(key);
    if (!reg || !reg->storage_ptr) return -1; // 校验存在性

#define raw_data[2]; // 用于存储原始寄存器值
    // 发送Modbus读取请求（以保持寄存器为例）
    if (modbus_read_registers(ctx, reg->reg_addr, 
            (reg->data_type == REG_FLOAT) ? 2 : 1, raw_data) < 0) {
        return -2; // 读取失败
    }

    // 解析数据并存储到指定地址
    switch (reg->data_type) {
        case REG_UINT16:
            *(uint16_t*)(reg->storage_ptr) = raw_data[0];
            break;
        case REG_FLOAT:
            *(float*)(reg->storage_ptr) = modbus_get_float(raw_data); // 需处理字节序
            break;
    }
    return 0;
}

int write_by_key(modbus_t *ctx, const char* key) {
    ModbusRegMap *reg = find_reg_by_key(key);
    if (!reg || reg->access == 0) return -1; // 检查权限

#define raw_data[2];
    // 根据数据类型转换待写入值
    switch (reg->data_type) {
        case REG_UINT16:
            raw_data[0] = *(uint16_t*)(reg->storage_ptr);
            modbus_write_register(ctx, reg->reg_addr, raw_data[0]);
            break;
        case REG_FLOAT:
            modbus_set_float(*(float*)(reg->storage_ptr), raw_data); // 转换为寄存器值
            modbus_write_registers(ctx, reg->reg_addr, 2, raw_data);
            break;
    }
    return 0;
}